package com.ssm.design.chain.handler.v3;

import com.ssm.design.chain.OrderHandlerChainV3;
import com.ssm.design.chain.context.OrderHandleContextV3;
import com.ssm.design.common.enums.OrderTypeEnum;

import java.util.Objects;

public abstract class AbstractOrderHandlerV3 {

    /**
     * 区分类型
     *
     * @return
     */
    protected OrderTypeEnum getTypeEnum() {
        return null;
    }

    /**
     * 我是否愿意处理
     *
     * @param context
     * @return
     */
    protected boolean isThisNodeDeal(OrderHandleContextV3 context) {
        return Objects.nonNull(getTypeEnum())
                && Objects.equals(context.getTypeEnum(), getTypeEnum());
    }

    /**
     * 核心处理
     *
     * @param context 上下文
     * @param args    拓展参数
     */
    public void doHandle(OrderHandleContextV3 context,
                         OrderHandlerChainV3 chain, Object... args) {
        // 我是否可以处理
        if (isThisNodeDeal(context)) {
            // 让我来处理
            doHandle(context, args);
        }
        // 我处理完了，交给下家
        chain.handle(context, args);
    }

    /**
     * 具体业务处理
     *
     * @param context
     * @param args
     */
    public abstract void doHandle(OrderHandleContextV3 context, Object... args);

}